//引入Vue

import Vue from 'vue';
import VueRouter from 'vue-router';
//引入store
import store from '@/store'
//使用插件
Vue.use(VueRouter);
//备份VueRouter.prototype原有的push||replace方法
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
VueRouter.prototype.push = function (location,resolve,reject){
    //第一种情况：外部在使用push的时候传递成功与失败的回调
    if(resolve && reject){
        originPush.call(this,location,resolve,reject);
    }else{
        //第二种情况：外部在使用push方法时候，没有传递成功与失败的回调函数
        originPush.call(this,location,()=>{ },()=>{ });    
    }
}
//重写VueRouter.prototype.replace方法
VueRouter.prototype.replace = function(location,resolve,reject){
(resolve && reject)? originReplace.call(this,location,resolve,reject ):originReplace.call(this,location,()=>{ },()=>{ })
}

import routes from './routes.js'

//对外默认暴露一个Vue实例
//在路由配置的时候，对外暴露一个Router 类的实例
const router = new VueRouter({
    //配置路由
    routes,
    scrollBehavior(to,form,savePosition){
        return {y:0}
    }
});
//全局守卫的使用：全局守卫router[VueRouter类的一个实例]的方法
//全局守卫【前置守卫：在路由跳转之前会执行一次】
router.beforeEach(async (to,from,next)=>{
 //to:要去哪里【路由信息】
 //from:从哪里来【路由信息】
 //next:一个函数，放行函数
 //1：next()执行不传递参数【放行该去哪里，去哪里】
 //2：next(path)放行，放行到准确的某一个路由当中
 //获取仓库中的token,因为用户登录了，仓库中一定有token,用户没有登录就一定没有token
 let token =store.state.user.token;
 let name = store.state.user.userInfo.name;
    if(token){
        //用户登录了，且想去登录页面的分支
        if(to.path=="/login"){
            next('/home');
            //用户登录了且想去的不是用户登录的分支
        }else{
             if(name){
                 //next 代表该去哪里就去哪里
             next();
             }else{
                 //代表用户登录了，且没有用户信息
                 try{
                     //代表用户登录了，但是没有 用户信息，发请求 让仓库存储用户信息，再进行路由跳转
                    await store.dispatch('getUserInfo');
                    //该去哪里去哪里
                    next();
                 }catch(error){
                    //token过期失效了：清除本地token（过期的）
                    await store.dispatch('userLogout');
                    //清除本地数据之后，让用户回到登录页面，重新登录，获取新的token
                    next('/login')
                 }
             }
        }
    }else{
        //用户未登录，该去哪里去哪里
        //目前未登录的判断还没有做完，将来这里还需要判断
        next();
    }
})

export default router;